/**
 * 四海兄弟工作小组，群号:160517807
 * @author 乔继承
 * @date 2013年9月23日 下午10:01:32 
 * @version V1.0   
 */
package org.mcpro.core.model;

import org.mcpro.common.util.IDFactory;
import org.mcpro.common.util.ObjectUtil;

/**
 * 描述对象的属性
 * 
 * @author 乔继承
 * @date 2013年9月23日 下午10:00:16
 * 
 */
public class DictObject2field {
	private String id;
	private String idObject;// 关联的DictObject对象的id
	private String sfieldName;// 对象的字段
	private String sdbtype;// 对象字段的数据库类型
	private Integer ifieldLength;// 对象字段的数据库长度
	private Boolean bisNull=true;// 对象字段是否为空
	private String defaultValue;// 对象数据库的默认值
	private Boolean bprimaryKey=false;// 对象字段在数据库中是否为主键，可能存在联合主键的情况，但系统最好不要这么设计
	private String suiName;// 对象字段的页面显示类型，这里没有考虑国际话
	private String snote;// 字段的描述

	public DictObject2field() {
	};
	/**
	 * 获取主键的dictObject对象
	 * @return
	 * @author 乔继承
	 * @date 2014年3月22日 下午4:27:45
	 */
	public DictObject2field getPrimaryKeyDictObject(){
		if(ObjectUtil.isEmpty(id)){
			this.id=IDFactory.getNumberid();
		}
		this.sfieldName="id";
		this.sdbtype="varchar";
		this.ifieldLength=32;
		this.bisNull=false;
		this.bprimaryKey=true;
		this.suiName="主键";
		this.snote="主键";
		return this;
	}

	/**
	 * 对象字段的构造方法，用以创建数据库是使用
	 * 
	 * @param sfieldName
	 * @param sdbtype
	 * @param ifieldLength
	 * @param bisNull
	 * @param bprimaryKey
	 * @param snote
	 */
	public DictObject2field(String sfieldName, String sdbtype,
			Integer ifieldLength, Boolean bisNull, Boolean bprimaryKey,
			String defaultValue, String snote) {
		this.sfieldName = sfieldName;
		this.sdbtype = sdbtype;
		this.ifieldLength = ifieldLength;
		this.bisNull = bisNull;
		this.bprimaryKey = bprimaryKey;
		this.defaultValue = defaultValue;
		this.snote = snote;
	};

	/**
	 * 对象字段的构造方法，用以查询数据库字段是使用
	 * 
	 * @param id
	 * @param idObject
	 * @param sfieldName
	 * @param suiName
	 */
	public DictObject2field(String id, String idObject, String sfieldName,
			String suiName) {
		this.id = id;
		this.idObject = idObject;
		this.sfieldName = sfieldName;
		this.suiName = suiName;
	};

	/**
	 * 对象字段的构造方法，用以一次性设置完成所有的值
	 * 
	 * @param id
	 * @param idObject
	 * @param sfieldName
	 * @param sdbtype
	 * @param ifieldLength
	 * @param bisNull
	 * @param defaultValue
	 * @param bprimaryKey
	 * @param suiName
	 * @param snote
	 */
	public DictObject2field(String id, String idObject, String sfieldName,
			String sdbtype, Integer ifieldLength, Boolean bisNull,
			String defaultValue, Boolean bprimaryKey, String suiName,
			String snote) {
		super();
		this.id = id;
		this.idObject = idObject;
		this.sfieldName = sfieldName;
		this.sdbtype = sdbtype;
		this.ifieldLength = ifieldLength;
		this.bisNull = bisNull;
		this.defaultValue = defaultValue;
		this.bprimaryKey = bprimaryKey;
		this.suiName = suiName;
		this.snote = snote;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getIdObject() {
		return idObject;
	}

	public void setIdObject(String idObject) {
		this.idObject = idObject;
	}

	public String getSfieldName() {
		return sfieldName;
	}

	public void setSfieldName(String sfieldName) {
		this.sfieldName = sfieldName;
	}

	public String getSdbtype() {
		return sdbtype;
	}

	public void setSdbtype(String sdbtype) {
		this.sdbtype = sdbtype;
	}

	public Integer getIfieldLength() {
		return ifieldLength;
	}

	public void setIfieldLength(Integer ifieldLength) {
		this.ifieldLength = ifieldLength;
	}

	public Boolean getBisNull() {
		return bisNull;
	}

	public void setBisNull(Boolean bisNull) {
		this.bisNull = bisNull;
	}

	public String getDefaultValue() {
		return defaultValue;
	}

	public void setDefaultValue(String defaultValue) {
		this.defaultValue = defaultValue;
	}

	public Boolean getBprimaryKey() {
		return bprimaryKey;
	}

	public void setBprimaryKey(Boolean bprimaryKey) {
		this.bprimaryKey = bprimaryKey;
	}

	public String getSuiName() {
		return suiName;
	}

	public void setSuiName(String suiName) {
		this.suiName = suiName;
	}

	public String getSnote() {
		return snote;
	}

	public void setSnote(String snote) {
		this.snote = snote;
	}

	/**
	 * 根据对象字段的属性获取相应的建表语句
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月4日 下午11:00:25
	 */
	public String getInsertDictObject2FieldSql() {
		if (ObjectUtil.isEmpty(sdbtype) || ObjectUtil.isEmpty(sfieldName)) {
			return null;
		}
		StringBuffer sql = new StringBuffer();
		sql.append(
				"INSERT INTO dict_object2field(`id`,`idObject`,`sfieldName`,`sdbtype`,`ifieldLength`,`bisNull`,`defaultValue`,`bprimaryKey`,`suiName`,`snote`)values(")
				.append("'").append(id).append("',").append("'")
				.append(idObject).append("',").append("'").append(sfieldName)
				.append("',").append("'").append(sdbtype).append("',")
				.append(ifieldLength).append(",").append(bisNull).append(",")
				.append("'").append(defaultValue).append("',")
				.append(bprimaryKey).append(",").append("'").append(suiName)
				.append("',").append("'").append(snote).append("')");
		return sql.toString();
	}

	/**
	 * 根据传入的表名和当前对象的状态获取添加到当前表的sql语句
	 * 
	 * @param stableName
	 *            表名
	 * @param primarykeys
	 *            当前表的主键，可选字段
	 * @return
	 * @author 乔继承
	 * @date 2014年3月15日 下午11:39:25
	 */
	public String getAddColumnSql(String stableName, String... primarykeys) {
		if (ObjectUtil.isEmpty(stableName)) {
			return null;
		}
		// alter table `person` add column `sdfdsf` varchar(30) DEFAULT '1' NOT
		// NULL COMMENT 'asdqwe',
		// drop primary key,add primary key(`asdf`, `sdfdsf`)
		if (ObjectUtil.isEmpty(stableName) || ObjectUtil.isEmpty(sfieldName)
				|| ObjectUtil.isEmpty(sdbtype) || ifieldLength <= 0) {
			return null;
		}
		StringBuffer sql = new StringBuffer();
		sql.append("alter table ").append("`").append(stableName).append("`")
				.append(" add column `").append(sfieldName).append("` ")
				.append(sdbtype).append("(").append(ifieldLength).append(")");

		if (ObjectUtil.isNotEmpty(defaultValue)) {
			sql.append(" default ");
			if (sdbtype == "int") {
				sql.append(defaultValue);
			} else {
				sql.append("'").append(defaultValue).append("'");
			}

		}
		if (!bisNull) {
			sql.append(" not null ");
		}
		if (ObjectUtil.isNotEmpty(snote)) {
			sql.append(" comment ").append("'").append(snote).append("'");
		}
		if (bprimaryKey) {
			sql.append(",drop primary key,").append("add primary key")
					.append("(").append("`").append(sfieldName).append("`");
			if (ObjectUtil.isNotEmpty(primarykeys)) {
				for (String primaryKey : primarykeys) {
					sql.append(",`").append(primaryKey).append("`");
				}
			}
			sql.append(")");
		}

		return sql.toString();
	}

	/**
	 * 根据对象属性的当前状态，构造修改表的相关sql语句，
	 * 
	 * @param tableName
	 * @param originColumnName
	 * @return
	 * @author 乔继承
	 * @date 2014年3月16日 上午10:01:40
	 */
	public String getAlterColumnSql(String tableName, String originColumnName,
			String... primarykeys) {
		// ALTER TABLE `person` CHANGE `cc` `ddd` VARCHAR(60) DEFAULT 'abc' NOT
		// NULL COMMENT '测试1',
		if (ObjectUtil.isEmpty(tableName)
				|| ObjectUtil.isEmpty(originColumnName)
				|| ObjectUtil.isEmpty(sfieldName)
				|| ObjectUtil.isEmpty(sdbtype) || ifieldLength <= 0) {
			return null;
		}
		StringBuffer sql = new StringBuffer();
		sql.append("alter table ").append("`").append(tableName).append("`");
		sql.append(" change ").append("`").append(originColumnName).append("`")
				.append(" `").append(sfieldName).append("` ").append(sdbtype)
				.append("(").append(ifieldLength).append(")");
		if (ObjectUtil.isNotEmpty(defaultValue)) {
			sql.append(" default ");
			if (sdbtype.equals("int")) {
				sql.append(defaultValue);
			} else {
				sql.append("`").append(defaultValue).append("`");
			}
		}
		if (!bisNull) {
			sql.append(" not null");
		}
		if (ObjectUtil.isNotEmpty(snote)) {
			sql.append(" comment ").append("'").append(snote).append("'");
		}
		if (bprimaryKey) {
			sql.append(",drop primary key,").append("add primary key")
					.append("(").append("`").append(sfieldName).append("`");
			if (ObjectUtil.isNotEmpty(primarykeys)) {
				for (String primaryKey : primarykeys) {
					sql.append(",`").append(primaryKey).append("`");
				}
			}
			sql.append(")");
		}
		return sql.toString();
	}

	/**
	 * @return
	 * @author 乔继承
	 * @date 2014年3月16日 上午10:33:35
	 */
	public String getUpdateDictObject2FieldSql() {
		// UPDATE `person` SET `username`='asdasdasd',`password`='asdasd' WHERE
		// sdfdsf`='1';
		if (ObjectUtil.isEmpty(id)) {
			return null;
		}
		StringBuffer sql = new StringBuffer();
		String condition = " where `id`='" + id + "'";
		sql.append("update `dict_object2field`").append(" set");
		if (ObjectUtil.isNotEmpty(sfieldName)) {
			sql.append(" `sfieldName`='").append(sfieldName).append("',");
		}
		if (ObjectUtil.isNotEmpty(sdbtype)) {
			sql.append(" `sdbtype`='").append(sdbtype).append("',");
		}
		if (ifieldLength >= 0) {
			sql.append(" `ifieldLength`='").append(ifieldLength).append("',");
		}
		if (!bisNull) {
			sql.append(" `bisNull`=").append(1).append(",");
		}
		if (ObjectUtil.isNotEmpty(defaultValue)) {
			sql.append(" `defaultValue`='").append(defaultValue).append("',");
		}
		if (ObjectUtil.isNotEmpty(suiName)) {
			sql.append(" `suiName`='").append(suiName).append("',");
		}
		if (ObjectUtil.isNotEmpty(snote)) {
			sql.append(" `snote`='").append(snote).append("',");
		}
		String strSql = sql.substring(0, sql.length() - 1)
				+ condition.toString();
		return strSql;
	}
}
